package cn.demoncat.util.mybatis.util;

import cn.demoncat.util.exception.BizRuntimeException;
import cn.demoncat.util.lang.StringUtil;
import cn.demoncat.util.lang.entity.Result;
import cn.demoncat.util.mybatis.constant.MapperConstant;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * 数据库操作工具
 * 
 * @author 延晓磊
 *
 * @since 2019年1月4日
 */
public final class MapperUtil {

	/**
	 * 删除树形数据的结果校验
	 * 
	 * @param result		删除的记录数（deleteTree的结果）
	 * @param canNull		允许数据不存在：true返回0，false抛异常
	 * @param canHasChild	允许有子节点：true返回-1，false抛异常
	 * @param childErrMsg	有子节点时的错误信息，为空时默认消息“请先删除子节点”
	 * 
	 * @return 成功1，有子节点时返回-1或异常，数据不存在返回0或异常
	 * 
	 * @exception BizRuntimeException 数据不存在、有子节点时
	 * 
	 * @author 延晓磊
	 *
	 * @since 2017年10月28日
	 */
	public static int valiDeleteTreeResult(int result, boolean canNull, boolean canHasChild, String childErrMsg) {
		// 数据不存在
		if (!canNull && result == 0) {
			throw new BizRuntimeException(Result.ERROR_DATA_NULL.getMsg());
		}
		// 有子节点
		if (!canHasChild && result == -1) {
			throw new BizRuntimeException(StringUtil.toDefault(childErrMsg, Result.ERROR_DELETE_CHILDREN.getMsg()));
		}
		return result;
	}
	
	/**
	 * 添加排序条件
	 * 
	 * @param condition		查询条件
	 * @param sortColumns	排序条件
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月15日
	 */
	public static Map<String, Object> addSortColumns(Map<String, Object> condition, String sortColumns){
		if (condition == null) {
			condition = new HashMap<>();
		}
		condition.put(MapperConstant.ParamName.SORT_COLUMNS, sortColumns);
		return condition;
	}
	
	/**
	 * 添加分组条件
	 * 
	 * @param condition		查询条件
	 * @param groupColumns	分组条件
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月15日
	 */
	public static Map<String, Object> addGroupColumns(Map<String, Object> condition, String groupColumns){
		if (condition == null) {
			condition = new HashMap<>();
		}
		condition.put(MapperConstant.ParamName.GROUP_COLUMNS, groupColumns);
		return condition;
	}
	
	/**
	 * 添加时间区间条件
	 * 
	 * @param condition		查询条件
	 * @param startTime		开始时间
	 * @param endTime		结束时间
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月15日
	 */
	public static Map<String, Object> addTime(Map<String, Object> condition, String startTime, String endTime){
		if (condition == null) {
			condition = new HashMap<>();
		}
		if (StringUtils.isNotBlank(startTime)) {
			condition.put(MapperConstant.ParamName.START_TIME, startTime);
		}
		if (StringUtils.isNotBlank(endTime)) {
			condition.put(MapperConstant.ParamName.END_TIME, endTime);
		}
		return condition;
	}
	
	/**
	 * 添加创建时间区间条件
	 * 
	 * @param condition		查询条件
	 * @param startTime		开始时间
	 * @param endTime		结束时间
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月15日
	 */
	public static Map<String, Object> addCreateTime(Map<String, Object> condition, String startTime, String endTime){
		if (condition == null) {
			condition = new HashMap<>();
		}
		if (StringUtils.isNotBlank(startTime)) {
			condition.put(MapperConstant.ParamName.START_CREATE_TIME, startTime);
		}
		if (StringUtils.isNotBlank(endTime)) {
			condition.put(MapperConstant.ParamName.END_CREATE_TIME, endTime);
		}
		return condition;
	}
	
	/**
	 * 添加更新时间区间条件
	 * 
	 * @param condition		查询条件
	 * @param startTime		开始时间
	 * @param endTime		结束时间
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月15日
	 */
	public static Map<String, Object> addUpdateTime(Map<String, Object> condition, String startTime, String endTime){
		if (condition == null) {
			condition = new HashMap<>();
		}
		if (StringUtils.isNotBlank(startTime)) {
			condition.put(MapperConstant.ParamName.START_UPDATE_TIME, startTime);
		}
		if (StringUtils.isNotBlank(endTime)) {
			condition.put(MapperConstant.ParamName.END_UPDATE_TIME, endTime);
		}
		return condition;
	}
	
	/**
	 * 添加ids条件
	 * 
	 * @param condition		查询条件
	 * @param ids			ID集
	 * @return
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月15日
	 */
	public static <P>Map<String, Object> addIds(Map<String, Object> condition, Collection<P> ids){
		if (condition == null) {
			condition = new HashMap<>();
		}
		if (CollectionUtils.isNotEmpty(ids)) {
			condition.put(MapperConstant.ParamName.IDS, ids);
		}
		return condition;
	}
}
